﻿using mysss.tools;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Configuration;

namespace mysss
{
    public class AutoAddPeopleNoForbbid : AndroidControlSDK.AndroidScript
    {
        //私有变量
            //存储插件用户的配置信息
        /// <summary>
        /// 一小时的毫秒数
        /// </summary>
        private int oneHour;
        /// <summary>
        /// 一天的毫秒数
        /// </summary>
        private int oneDay;
        /// <summary>
        /// 等一个小时要达到的人数
        /// </summary>
        private int waitOneHourNum;
        /// <summary>
        /// 等一天要达到的人数
        /// </summary>
        private int waitOneDayNum;
        /// <summary>
        /// 验证信息
        /// </summary>
        private string validateContext;

        //微信号列表所在的文件
        private string fileName;   //要读取的文件名

        //临界资源 
        private IList<string> wxItems;

        //返回 插件描述
        public override string Description()
        {
            return "自动微信加人，并且不被封号";
        }

        //返回 插件名称
        public override string Name()
        {
            return "模拟人工加微信";
        }

        //插件的功能主体
        public override void RunScript()
        {
            //当前线程用于运行控制台
                //加载配置文件中的配置信息,以及启动主控制面板
            AppSetting frm_aps = new AppSetting();
            frm_aps.loadAppSettingEvent += loadAppSettings;
            frm_aps.doingEvent += Doing;
            frm_aps.ShowDialog();

            //Thread mainThread = new Thread(new ThreadStart(frm_aps.Show));

            //窗口线程执行结束，才能结束当前的这个函数
            //ShowStatus("mainThread.Start...");
            //mainThread.Start();
            //Thread.Sleep(5000);
            //ShowStatus("mainThread.Join...");
            //mainThread.Join();
            //Thread.Sleep(5000);
            //将加好友的主体，放在另一个线程中执行
            

            //现在的问题来了，如何控制这两个线程的交互呢？ 首先，要保证基本配置信息加载之后，才能执行Doing线程。
            //当执行Doing之后，Doing中的信息，要能够反馈给控制面板。
        }

        private void Doing()
        {
            ShowStatus("程序开始执行……33333 " + fileName);
            Thread.Sleep(5000);

            //判断，是否存在微信号
            if (wxItems == null || wxItems.Count < 1)
            {
                ShowStatus("txt中,已经没有数据了，请添加之后，再运行本插件。。。。。。(5秒后，自动结束运行)");
                Thread.Sleep(5000);
                return;  //结束插件运行
            }

            ShowStatus(wxItems[0] + "\n" + wxItems[1] + "\n" + wxItems[2] + "\n");
            Thread.Sleep(5000);

            //当前微信号 已添加好友人数(微信号数量) （这样每个微信号，各自持有一个 自己的 变量）
            ThreadLocal<int> addedNumLocal = new ThreadLocal<int>();
            addedNumLocal.Value = 0;

            ShowStatus("程序开始执行……55555--开始进入循环........");
            Thread.Sleep(5000);

            while (true) //永真循环，意味着插件一直在运行。
            {
                string item; // 单个微信号信息

                ShowStatus("进入内层循环............11111");
                Thread.Sleep(5000);

                while (wxItems.Count > 0)
                {
                    addedNumLocal.Value++;     //累加
                    ShowStatus("第" + (addedNumLocal.Value) + "遍，执行循环。。。。。。。");
                    Thread.Sleep(2000);

                    ShowStatus("加" + waitOneHourNum + "个，停1小时，加" + waitOneDayNum + "个，停一天");
                    Thread.Sleep(2000);

                    lock (wxItems)  //锁定 wxItems临界资源 防止 多个微信号 添加同一个 人 为好友。
                    {
                        item = wxItems[0];

                        ShowStatus("进入加好友函数........222222");
                        addWXFriend(item);// 利用 根据item的值，添加微信好友

                        //每次加好友之后，随机停顿一定的时间
                        int stopTime = getRandomWaitTime();
                        ShowStatus("加下一个好友，停顿" + stopTime / 1000 + "秒");
                        Thread.Sleep(stopTime);

                        wxItems.Remove(item); //移除已经添加过的元素 

                        ShowStatus("添加完一个好友之后，立刻把剩余的数据写回。。。(2秒后开始写回)");
                        Thread.Sleep(2000);
                        //将剩余的项，写回txt文件
                        writeBackToTxt();
                    }

                    //如果已经没有手机号可被读取
                    if (wxItems.Count < 1)
                    {
                        ShowStatus("txt中,已经没有数据了，请添加之后，再运行本插件。。。。。。(5秒后，自动结束运行)");
                        Thread.Sleep(5000);
                        return;  //结束插件运行
                    }

                    //根据配置信息，控制加好友的人数以及停顿
                    if ((((addedNumLocal.Value - 1) % waitOneHourNum) + 1) >= waitOneHourNum)//如果达到 要等待一个小时的人数
                    {
                        ShowStatus("已达到停一个小时的条件");
                        Thread.Sleep(2000);
                        break;
                    }

                    if (addedNumLocal.Value >= waitOneDayNum)//如果达到 要等待一天的人数
                    {
                        ShowStatus("已达到停一天的条件");
                        Thread.Sleep(2000);
                        break;
                    }
                }

                ShowStatus("跳出了内层循环！ 已加好友" + addedNumLocal.Value + "个");
                Thread.Sleep(2000);

                ShowStatus("是否停止1小时：  " + (addedNumLocal.Value >= waitOneHourNum && addedNumLocal.Value < waitOneDayNum).ToString() + "1: " + (addedNumLocal.Value >= waitOneHourNum) + "2: " + (addedNumLocal.Value < waitOneDayNum));// 
                Thread.Sleep(2000);
                ShowStatus("是否停止1天：  " + (addedNumLocal.Value >= waitOneDayNum).ToString());
                Thread.Sleep(2000);

                //根据配置信息，控制加好友的人数以及停顿
                if (addedNumLocal.Value >= waitOneHourNum && addedNumLocal.Value < waitOneDayNum)//如果达到 要等待一个小时的人数
                {
                    ShowStatus("进入 停止一小时，再进行添加好友的状态！ 已加好友" + addedNumLocal.Value + "个");
                    Thread.Sleep(oneHour);
                }

                if (addedNumLocal.Value >= waitOneDayNum)//如果达到 要等待一天的人数
                {
                    ShowStatus("进入 停止一天，再进行添加好友的状态！ 已加好友" + addedNumLocal.Value + "个");



                    Thread.Sleep(oneDay);
                    addedNumLocal.Value = 0;           //添加的人数，重新进行计数
                }
            }
        }

        private void writeBackToTxt()
        {
            ShowStatus("正在写回剩余的手机号。。。。。。。。");
            StreamWriter sw = new StreamWriter(File.Create(fileName));      //重新创建，直接覆盖原有的文件
            lock (wxItems)      //需要在写回文件的时候加锁
            {
                foreach (string ii in wxItems)
                {
                    sw.WriteLine(ii);
                }
            }
            sw.Flush();
            ShowStatus("已写回完成。。。。。。。。");
            Thread.Sleep(2000);

            //关闭流
            sw.Close();
        }

        //返回一个 随机的 秒数
        private int getRandomWaitTime()
        {
            return new int[] { 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 }[21 % new Random().Next(0,21)] * 1000;
        }

        /// <summary>
        /// 加载配置文件中的配置信息
        /// </summary>
        /// <param name="oneHour">等待一小时的毫秒数</param>
        /// <param name="oneDay">等待一天的毫秒数</param>
        /// <param name="waitOneDayNum">停顿一小时，不加人的人数</param>
        /// <param name="waitOneHourNum">停顿一天，不加人的人数</param>
        /// <param name="validateContext">加好友时，验证信息的内容</param>
        private void loadAppSettings(int oneHour, int oneDay,int waitOneDayNum,int waitOneHourNum, string validateContext,string fileName,out bool hasLoadRight)
        {
            this.oneHour = oneHour;
            this.oneDay = oneDay;
            this.waitOneDayNum = waitOneDayNum;
            this.waitOneHourNum = waitOneHourNum;
            ShowStatus("验证消息："+validateContext);
            Thread.Sleep(5000);
            this.validateContext = validateContext;

            //判断是否正确加载了txt文件中的信息
            this.fileName = fileName;
            this.wxItems = FileInputAndGetList.getWeiXinIDItem(this.fileName);  //微信号单项
            //判断，是否存在微信号
            if (wxItems == null || wxItems.Count < 1)
            {
                ShowStatus("所选文件中的内容为空！");
                Thread.Sleep(5000);
                hasLoadRight = false;
            }
            //如果确实加载到了微信号，就返回true
            hasLoadRight = true;
        }

        /// <summary>
        /// 添加微信好友
        /// </summary>
        /// <param name="item">微信好友的ID</param>
        private void addWXFriend(string item)
        {
            //打开搜索好友界面
            ShowStatus("打开搜索好友界面");
            Thread.Sleep(2000);//停顿两秒

            var dic = new Dictionary<string, string> { { "act", "searchui" } };
            SendIntent(dic);
            Thread.Sleep(3000); //停顿三秒

            //在查找输入框中 填入 手机号 或是 微信号
            ShowStatus(FindAndInutText("android.widget.EditText", item, 0)+ "  等待三秒，待搜索结果展示出来");    //0,是选中第一个搜索到的结果
            Thread.Sleep(4000);//等待三秒，待搜索结果展示出来

            //点击 匹配到的 第一个结果
            //List<string> items = GetUiTexts("com.tencent.mm:id/agg");
            //ShowStatus(items.Count.ToString());
            //Thread.Sleep(2000);

            ShowStatus("点击匹配的第一个结果  "+ FindAndCLickObjByRegex("(查找手机/QQ号.*|查找微信号.*)"));
            Thread.Sleep(8000);

            //点击 添加到 通讯录按钮
            ShowStatus("点击............添加到通讯录.......11221122");
            var result = FindAndCLickObjByRegex("添加到通讯录");
            Thread.Sleep(2000);

            //如果按钮点击成功
            if (result.Contains("true"))
            {
                ShowStatus("进入If的第一个分支........按钮点击成功之后..........等待1秒");
                Thread.Sleep(1000);
                //查找输入框输入内容
                ShowStatus("输入配置文件中配置的 验证消息 "+ validateContext);
                Thread.Sleep(5000);
                ShowStatus("找到文本框，进行输入。。"+FindAndInutText("android.widget.EditText", validateContext, 0));
                Thread.Sleep(5000);
                //添加好友
                ShowStatus("点击。。。。。。“加为朋友|发送”。。。。。按钮。。。。。");
                ShowStatus(FindAndCLickObjByRegex("(加为朋友|发送)"));
                Thread.Sleep(3000);//停顿3秒
            }
            else
            {
                ShowStatus("该用户不存在！");
                //点击弹出框的确认按钮
                FindAndCLickObj("确定");
                Thread.Sleep(2000);
            }
            ShowStatus("添加好友  。。。"+" 函数执行结束。。。。。。");
        }
    };
}
